思考: XACT ABORTを使って途中でエラーになったトランザクションをロールバックする
from XACT ABORTを使って途中でエラーになったトランザクションをロールバックする
SQL Serverのトランザクションまわりがいまいちピンとこない
まず言葉がわからないので調べ方がわからない
SQL Serverでは明示的なトランザクションと暗黙的なトランザクションがある
入れ子のBEGIN TRANSACTIONの中でROLLBACKすると全体がロールバックされる
特定のトランザクションまで戻るとかできる?
BEGIN TRANSACTION transaction_nameでトランザクションに名前を割り当てたらできそう
使ってるツールによって挙動違うとかある?
今トランザクション中だよみたいな状態ってわかる?
システム関数 (Transact-SQL) - SQL Server | Microsoft Docs
@@TRANCOUNT (Transact-SQL) - SQL Server | Microsoft Docs
BEGIN TRANSACTIONで1増える
COMMITで1減る
ROLLBACKで0に
構成関数
@@OPTIONS (Transact-SQL) - SQL Server | Microsoft Docs
XACT_STATE (Transact-SQL) - SQL Server | Microsoft Docs
一意制約違反の場合はロールバックしてくれない
複数データINSERTしている場合成功しているものは残ってしまう
戻せないの?
ROLLBACKすれば戻せる
トランザクションの状態は続いているから
@@TRANCOUNTでわかる
1個失敗したら全部ロールバックしてほしい…
オプションである
SET XACT_ABORT (Transact-SQL) - SQL Server | Microsoft Docs
ONにすると@@OPTIONSに+16384
user options サーバー構成オプションの構成 - SQL Server | Microsoft Docs
16384 XACT_ABORT Transact-SQL ステートメントで実行時エラーが発生した場合、トランザクションをロールバックします。
XACT_ABORT ONのデメリットがいまいちわからない
途中までの処理までロールバックしないようにということなんだろうけど…
複数のクエリをまとめて処理する時って、「辻褄があう一連の処理」になるように作る気がする
ユーザー情報テーブルをUPDATE、次に関連するテーブルをINSERT...みたいな
開発用のDBで動かして問題がなければ、それをまるっと本番用のDBで動かす
開発用DBと本番用DBでデータにちょっと差異があって本番でコケた!
事前に検証したはずなのに!(原因は色々)
もう一回やりなおしたい!
「とりあえず失敗したところまでは反映しておいたわ」で嬉しいパターンがあんまり思いつかない
めちゃくちゃ件数が多いからとにかく成功するまで突っ込みたいとか?
↓これだと(誤ってCOMMITしたら)テーブルの状態が変わってしまわない?
トランザクション開始しました
INSERT実行しました
100件目で一意制約違反エラー出ました
99件目までは成功してるんで突っ込んでます
COMMIT or ROLLBACK待ち…